package controleur;

import java.util.ArrayList;

import modele.Amelioration;
import modele.Joueur;
import modele.Position;
import modele.Batiment.Batiment;
import modele.Batiment.Laboratoire;
import modele.Unite.Ouvrier;
import modele.Unite.Unite;
import modele.Unite.UniteAttaquante;
import modele.Batiment.CampMilitaire;

/**
 * L'interface control permet à la vue de dialoguer avec le controleur
 * @author thomas
 *
 */
public interface Control {
	/**
	 * sélectionne un batiment
	 * @param x représente l'abscisse du batiment dans la matrice du modèle
	 * @param y représente l'ordonnée du batiment dans la matrice du modèle
	 */
	//void selectionnerBatiment(int x, int y);
	
	/**
	 * améliore le batiment sélectionné
	 */
	void ameliorerBatiment(Batiment batiment);
	
	/**
	 * 
	 * @param batiment batiment à créer
	 */
	void construireBatiment(Batiment batiment);//la position du batiment doit être initialisée
	
	/**
	 * 
	 * @param unite unite à créer
	 * @param camp camp qui crée l'unite
	 */
	void creerUniteAttaquante(CampMilitaire camp, UniteAttaquante unite);
	
	/**
	 * retourne la liste des batiment du joueur
	 * @return liste des batiments du joueur
	 */
	ArrayList<Batiment> recupererListeBatiment();
	
	/**
	 * retourne la liste des ouvriers du joueur
	 * @return liste des ouvriers du joueur
	 */
	ArrayList<Ouvrier> recupererListeOuvrier();
	
	/**
	 * 
	 * @return liste des unités attaquantes du joueur
	 */
	ArrayList<UniteAttaquante> recupererListeUniteAttaquante();
	
	/**
	 * ne fonctionne pas
	 * @param pos position dans la vue
	 * @return position correspondante dans le modèle
	 */
	Position PositionVueToPositionModele(Position pos);
	
	/**
	 * @param pos position dans le modèle
	 * @return position correspondante dans la vue
	 */
	Position PositionModeleToPositionVue(Position pos);
	
	/**
	 * retourne l'or que possède le joueur
	 * @return
	 */
	int recupererOrJoueur();
	
	/**
	 * retourne l'élixir que possède le joueur
	 * @return
	 */
	int recupererElixirJoueur();
	
	/**
	 * sauvegarde l'état de la partie en cours
	 * @param nomSauvegarde nom du fichier dans lequel sauvegarder la partie
	 */
	public void sauvegarderPartie(String nomSauvegarde);
	
	/**
	 * charge la partie stockée dans le fichier nomSauvegarde
	 * @param nomSauvegarde nom du fichier à partir duquel la partie sera chargée
	 * @return 0 si le chargement échoue, 1 s'il réussit
	 */
	public int chargerPartie(String nomSauvegarde);
	
	public Joueur getJoueur();
	
	public int getNumeroQueteActuelle();
	
	/////////////////////////////////////////////////////////////
	//		Partie référant au développement des améliorations
	/////////////////////////////////////////////////////////////
	
	
	/**
	 * augmente le niveau de l'amélioration AmeliorationPuissanceAttaque
	 */
	public void augmenterNiveauAmeliorationPuissanceAttaque(Laboratoire labo);
	
	/////////////////////////////////////////////////////////////////
	//		Partie de l'interface référant à l'attaque de l'ennemi
	/////////////////////////////////////////////////////////////////
	
	/**
	 * 
	 * @return liste des Batiments de l'ennemi
	 */
	ArrayList<Batiment> recupererListeBatimentEnnemi();
	
	/**
	 * passe le modèle dans l'état etatAttaque (booléen)
	 */
	void attaquerEnnemi();
	
	/**
	 * passe le modèle dans l'état etatAttaque (booléen)
	 */
	void finirAttaqueEnnemi();
	
	/**
	 * place l'unite attaquante pendant l'attaque (pas de déplacement, le placement est instantané)
	 * @param uniteAttaquante
	 * @param position position à laquelle placer l'unité
	 */
	void placerUniteAttaquante(Unite unite);
	
	/**
	 * détermine si la partie est dans l'état d'attaque ou de développement
	 * @return true si la partie est en état d'attaque, false si la partie est en état de développement
	 */
	public boolean EtreEnTrainDAttaquer();
	
	/**
	 * lance l'assaut une fois que les unités attaquantes sont placées
	 */
	//public void lancerAssaut();
	
	public ArrayList<UniteAttaquante> recupererListeUniteAttaquanteEngagees();
	
}
